package org.example.interceptor;

import org.example.annotation.LoginCheck;
import org.example.domain.User;
import org.example.util.CommonParam;
import org.example.util.UserThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * 这个拦截器帮我们做权限控制
 * 如果访问的是servlet资源 判断方法是否存在LoginCheck注解 存在 需要登录 没有登录返回登录页
 * 但是我们项目用了security这个就不用了 废弃掉  在webMvcConfig中清除该拦截器的配置
 */
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Value("${server.servlet.context-path}")
    private String contextPath;
    @Autowired
    private UserThreadLocalUtil userThreadLocalUtil;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断是否存在loginCheck注解  存在需要判定是否登录  没有去登录页 登录就放过
        LoginCheck annotation = null;
        if (handler instanceof HandlerMethod){
            HandlerMethod method = (HandlerMethod) handler;
            annotation = method.getMethodAnnotation(LoginCheck.class);
        }else {
            return true;
        }
        if (annotation!=null){
            //存在做登录判定  我不知道多个拦截器的执行顺序 如果是xml配置就是配置顺序 但这个是声明就不知道了  因为之前有一个拦截器也是做登录判定的
            User user = userThreadLocalUtil.get();
            if(user!=null){
                //登录过
                return true;
            }else {
                //不一定 因为拦截器的执行顺序不知道
                Cookie[] cookies = request.getCookies();
                if (cookies == null || cookies.length<=0){
                    response.sendRedirect(contextPath+"/user/login.html");
                    return false;
                }
                for (Cookie temp : cookies){
                    if (temp.getName().equals(CommonParam.TICKET_SYMBOL)){
                        return true;
                    }
                }
                response.sendRedirect(contextPath+"/user/login.html");
                return false;
            }
        }
        return true;
    }

}
